home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / pascal / ghostbbs.zip / COMPMESS.PAS < prev    next >
Pascal/Delphi Source File  |  1985-12-17  |  5KB  |  226 lines

  1. const
  2. maxlength = 50;
  3. maxmess = 400;
  4. numsects = 20;
  5.  
  6. type
  7.   str2      = string[2];
  8.   name      = string[14];
  9.   longname  = string[25];
  10.   filbuffer = array[0..127] of byte;
  11.   rate      = (slow,fast);
  12.   line      = string[80];
  13.   person    = string[27];
  14.   str10     = string[10];
  15.   long      = string[150];
  16.  
  17.    messages = record
  18.              sender   :person;
  19.              recver   :longname;
  20.              subject  :longname;
  21.              date     :name;
  22.              messno   :integer;
  23.              pointer  :integer;
  24.         end;
  25.  
  26.   messrec = record
  27.             mtext  : string[80];
  28.             pmess  : integer;
  29.          end;
  30.  
  31.    sectrec = record
  32.              sectname : string[25];
  33.              sectaccess : byte;
  34.              specaccess : byte;
  35.            end;
  36.  
  37.   sectnames = array[1..numsects] of sectrec;
  38.   messtext = array[1..maxlength] of line;
  39.  
  40. var
  41.   sections : sectnames;
  42.   tempmess : messages;
  43.   messagefile, outmess : file of messages;
  44.   textfile, outtext : file of messrec;
  45.   count: integer;
  46.   messtable: array[0..maxmess] of messages;
  47.   subdir : longname;
  48.   block : messtext;
  49.   tempsub : integer;
  50.   subboard : byte;
  51.   nextmess : byte;
  52.   lastline : byte;
  53.   jj : byte;
  54.   errcode : integer;
  55.   parm : string[10];
  56.   loop : integer;
  57.  
  58. function namemess(number: integer):line;
  59. { constructs file name for messages data files}
  60. var  temp:name;
  61.   begin
  62.     str(number,temp);
  63.     namemess := 'MESS' + temp + '.BBS';
  64.   end;
  65.  
  66. function outnamemess(number: integer):line;
  67. { constructs file name for messages data files}
  68. var  temp:name;
  69.   begin
  70.     str(number,temp);
  71.    outnamemess := 'XMESS' + temp + '.BBS';
  72.   end;
  73.  
  74. function nametitle(number: integer):line;
  75. { constructs file name for messages title files}
  76. var  temp:name;
  77.   begin
  78.     str(number,temp);
  79.     nametitle := 'TITLE' + temp + '.BBS';
  80.   end;
  81.  
  82. function outnametitle(number: integer):line;
  83. { constructs file name for messages title files}
  84. var  temp:name;
  85.   begin
  86.     str(number,temp);
  87.     outnametitle := 'XTITL' + temp + '.BBS';
  88.   end;
  89.  
  90. procedure initmess;
  91.   begin
  92.     writeln('Getting Messages ...');
  93.     count := 0;
  94.     assign(messagefile, nametitle(subboard));
  95.     {$I-} reset(messagefile) {$I+};
  96.     if IOresult = 0
  97.       then begin
  98.         while not eof(messagefile) do
  99.           begin
  100.             count := count + 1;
  101.             read(messagefile, messtable[count]);
  102.           end
  103.       end else rewrite(messagefile);
  104.       close(messagefile);
  105.       nextmess := count + 1;
  106.       assign (textfile,namemess(subboard));
  107.       {$I-}
  108.       reset(textfile);
  109.       {$I+}
  110.       if IoResult <> 0 then rewrite(textfile);
  111.       writeln('There are ', count , ' Messages.');
  112.     end;
  113.  
  114. procedure closemess;
  115.   var
  116.     loop: byte;
  117.   begin
  118.     assign(messagefile,nametitle(subboard));
  119.     rewrite(messagefile);
  120.     for loop := 1 to count do
  121.       write(messagefile, messtable[loop]);
  122.     close(messagefile);
  123.     close(textfile);
  124.   end;
  125.  
  126. function transmess(tabloc:byte):boolean;
  127. var
  128.   rtext   : messrec;
  129. begin
  130.   lastline := 1;
  131.   reset(textfile);
  132.   seek(textfile,messtable[tabloc].pointer);
  133.   {$I-}
  134.   read(textfile,rtext);
  135.   {$I+}
  136.   if ioresult <> 0
  137.     then begin
  138.       transmess := false;
  139.       exit;
  140.     end;
  141.  
  142.   block[lastline] := rtext.mtext;
  143.   while (rtext.pmess > 0) do
  144.     begin
  145.       seek(textfile,rtext.pmess);
  146.       {$I-}
  147.       read(textfile,rtext);
  148.       {$I+}
  149.       if ioresult <> 0
  150.         then begin
  151.           transmess := false;
  152.           exit;
  153.         end;
  154.       lastline := lastline + 1;
  155.       block[lastline] := rtext.mtext;
  156.     end;
  157.   transmess := true;
  158. end;
  159.  
  160.   var
  161.     tabloc: byte;
  162.     linenum: byte;
  163.  
  164.  
  165.   procedure storemess(tabloc: byte);
  166.     var
  167.       linenum: byte;
  168.       freearray : array[1..maxlength] of integer;
  169.       i : integer;
  170.       temp : messrec;
  171.  
  172.   procedure get_next;
  173.   var i , j ,errcode : integer;
  174.   begin
  175.     errcode := 0;
  176.     i := 0;
  177.     j := 0;
  178.     reset(outtext);
  179.         if filesize(outtext) = 0 then j := 0
  180.                                   else j := filesize(outtext);
  181.         while (i < lastline) do
  182.           begin
  183.             i := i + 1;
  184.             freearray[i] := j;
  185.             j := j + 1;
  186.           end;
  187.       end;
  188.  
  189.     begin {storemess}
  190.         reset(outtext);
  191.         get_next;
  192.         linenum := 1;
  193.         messtable[tabloc].pointer := freearray[1];
  194.         while linenum <= lastline do begin
  195.           if linenum = lastline then temp.pmess := 0
  196.                                   else temp.pmess := freearray[linenum+1];
  197.           temp.mtext := block[linenum];
  198.           seek(outtext,freearray[linenum]);
  199.           write(outtext,temp);
  200.           linenum := linenum + 1;
  201.         end;
  202.     end;
  203.  
  204. begin
  205.   parm := paramstr(1);
  206.   val(parm,tempsub,errcode);
  207.   if (errcode <> 0) then exit;
  208.   subboard := tempsub;
  209.   assign(outtext,outnamemess(subboard));
  210.   rewrite(outtext);
  211.   writeln('Compressing message base # ',subboard);
  212.   initmess;
  213.   for jj := 1 to count do
  214.     begin
  215.       writeln('Compressing Message #',jj);
  216.       if transmess(jj)
  217.         then storemess(jj)
  218.         else begin
  219.           for loop := jj + 1 to count do
  220.           messtable[loop-1] := messtable[loop];
  221.           count := count - 1;
  222.         end;
  223.     end;
  224.   close(outtext);
  225.   closemess;
  226. end.